/**
 * @file    cgal_source_halfedge.h
 * @author  fynkxo (fynkxo@163.com)
 * @brief   实现CGAL Surface_mesh 多边形网格半边源
 * @version 0.1
 * @date    2025-07-04
 *
 * @copyright Copyright (c) 2025 fynkxo
 *
 */

#ifndef CGAL_SOURCE_HALFEDGE_H_
#define CGAL_SOURCE_HALFEDGE_H_ 1

#include "cgal_source_base.hpp"
#include "gen_halfedge.h"

namespace cgalView {
/**
 * @brief 类cgal_source_halfedge实现CGAL Surface_mesh多边形网格半边源
 *
 * @author fynkxo
 * @date 2025年7月4日
 */
class cgal_source_halfedge : public cgal_source_base {
public:
  static cgal_source_halfedge *New() {
    VTK_STANDARD_NEW_BODY(cgal_source_halfedge);
  }

  vtkTypeMacro(cgal_source_halfedge, cgal_source_base);

public:
  /**
   * @brief 设置半边箭头的长度。 >0
   *
   * @param len
   */
  void set_arrow_length(double len) { d_gen.set_length_arrow(len); }

  /**
   * @brief 获取半边箭头的长度
   *
   * @return double
   */
  double get_arrow_length() const { d_gen.get_length_arrow(); }

  /**
   * @brief 设置显示半边的偏移
   *
   * @param halfedge_offset 偏移值。>= 0
   * @return double
   */
  void set_halfedge_offset(double halfedge_offset) {
    d_gen.set_halfedge_offset(halfedge_offset);
  }

  /**
   * @brief 获取显示半边的偏移值
   *
   * @return double
   */
  double get_halfedge_offset() const noexcept { d_gen.get_halfedge_offset(); }

  int get_angle_arrow() const noexcept { return d_gen.get_angle_arrow(); }

  void set_angle_arrow(int angle) { d_gen.set_angle_arrow(angle); }

protected:
  cgal_source_halfedge()
      : cgal_source_base(), d_len_arrow(10), d_halfedge_offset(0.1) {}

  virtual vtkTypeBool RequestData(vtkInformation *request,
                                  vtkInformationVector **inInfoVector,
                                  vtkInformationVector *outInfoVector) override;

private:
  double d_len_arrow;
  double d_halfedge_offset;
  gen_halfedge d_gen;
};
} // namespace cgalView
#endif // CGAL_SOURCE_HALFEDGE_H_